See Original text in context
multi sub trait_mod:<is>(Routine , :!)
There is a special trait for Routine
s called is default
. This trait is designed as a way to disambiguate multi
calls that would normally throw an error because the compiler would not know which one to use. This means that given the following two Routine
s, the one with the is default
trait will be called.
multi sub f() is defaultmulti sub f()f(); # OUTPUT: «"Hello there"»
The is default
trait can become very useful for debugging and other uses but keep in mind that it will only resolve an ambiguous dispatch between two Routine
s of the same precedence. If one of the Routine
s is narrower than another, then that one will be called. For example:
multi sub f() is defaultmulti sub f(:)f(); # "Use of uninitialized value $greet..."
In this example, the multi
without is default
was called because it was actually narrower than the Sub
with it.
See Original text in context
Sets the default value with which a variable is initialized, and to which it is reset when Nil is assigned to it. Trait arguments are evaluated at compile time. Closures won't do what you expect: they are stored as is and need to be called by hand.
my Int is default(42);say ; # OUTPUT: «42»= 5;say ; # OUTPUT: «5»# explicit reset:= Nil;say ; # OUTPUT: «42»
The trait is default
can be used also with subscripting things like arrays and hashes:
my is default( 'N/A' );[22].say; # OUTPUT: N/A= Nil;.say; # OUTPUT: [N/A][4].say; # OUTPUT: N/Amy is default( 'no-value-here' );<non-existent-key>.say; # OUTPUT: no-value-here<foo> = 'bar';<>.say; # OUTPUT: {foo => bar}<wrong-key>.say; # OUTPUT: no-value-here